﻿using System.Collections.Generic;
using System.Linq;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    /// <summary>
    /// Clase de negocio para las operaciones de la vista Atender Solisitud Recarga Archivo
    /// </summary>
    public class AtenderSolicitudRecargaNegocio
    {
        #region Campos

        /// <summary>
        /// Instancia para el acceso a datos de Solicitud de recargas de archivos.
        /// </summary>
        private readonly ISolicitudRecargaArchivoDao daoSolicitud;

        /// <summary>
        /// Instancia para el acceso a datos de los usuarios.
        /// </summary>
        private readonly IUsuarioDao daoUsuarios;

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="AtenderSolicitudRecargaNegocio"/>
        /// </summary>
        public AtenderSolicitudRecargaNegocio()
        {
            this.daoSolicitud = DataAccessFactory.Instance.CreateSolicitudRecargasDao();
            this.daoUsuarios = DataAccessFactory.Instance.CreateUsuariosDao();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Obtiene las solicitudes con estatus pendiente.
        /// </summary>
        /// <param name="idAutorizador">Es el id del autorizador por el que se filtrarán los archivos.</param>
        /// <returns>Lista de solicitudes con estatus pendiente</returns>
        public List<SolicitudRecargaArchivoInfo> GetSolicitudesPendientes(int idAutorizador)
        {
            List<SolicitudRecargaArchivoInfo> listSolicitudesPendientes;

            listSolicitudesPendientes = this.daoSolicitud.GetSolicitudesPendientes(idAutorizador).ToList();

            List<int> listIdsSolicitudes = new List<int>();

            List<CatalogoInfo> listSolicitantes = new List<CatalogoInfo>();

            foreach (SolicitudRecargaArchivoInfo solicitudPendiente in listSolicitudesPendientes)
            {
                listIdsSolicitudes.Add(solicitudPendiente.IdSolicitud);
            }

            // Obtener el nombre de los solicitantes.
            if(listIdsSolicitudes.Count != default(int))
            {
                listSolicitantes = this.GetNombreSolicitante(listIdsSolicitudes);
            }

            foreach(CatalogoInfo solicitante in listSolicitantes)
            {
                listSolicitudesPendientes.Where(p => p.IdSolicitud == solicitante.IdItem).Single().NombreSolicitante = solicitante.Descripcion;
            }

            return listSolicitudesPendientes;
        }

        /// <summary>
        /// Obtiene el nombre del solicitante de la solicitud de recarga de archivo.
        /// </summary>
        /// <param name="listIdsSolicitudes">Lista de ids de solicitudes.</param>
        /// <returns>Lista de ids de slicitudes y sus respectivos solicitantes.</returns>
        public List<CatalogoInfo> GetNombreSolicitante(List<int> listIdsSolicitudes)
        {
            return this.daoSolicitud.GetNombreSolicitante(listIdsSolicitudes).ToList();
        }

        /// <summary>
        /// Modifica el estatus de la solicitud.
        /// </summary>
        /// <param name="solicitud">Es la información de la solicitud que será modificada.</param>
        /// <param name="autorizarSolicitud">Indicador si a solicitud fue autorizada.</param>
        /// <param name="user">Usuario que ejecuta la operación.</param>        
        public void EditEstatusSolicitud(SolicitudRecargaArchivoInfo solicitud, bool autorizarSolicitud, string user)
        {
            this.daoSolicitud.EditEstatusSolicitud(solicitud, autorizarSolicitud, user);
        }


        /// <summary>
        /// Obtiene el usuario del sistema dado un Id especifico
        /// </summary>
        /// <param name="idUsuario">Id del usuario  a obtener</param>
        /// <returns></returns>
        public UsuarioInfo GetUsuarioById(int idUsuario)
        {
            return this.daoUsuarios.GetUsuarioById(idUsuario);
        }

        #endregion
    }
}
